#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define LENGTH(array) (sizeof(array) / sizeof(array[0]))

void printArray(int arr[], int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]); // 数组名arr被当作指针使用
    }
}

void xyArray()
{
    /* 一个带有 5 行 2 列的数组 */
    int a[5][2] = {{0, 0}, {1, 2}, {2, 4}, {3, 6}, {4, 8}};
    int i, j;

    /* 输出数组中每个元素的值 */
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 2; j++)
        {
            printf("a[%d][%d] = %d\n", i, j, a[i][j]);
        }
    }
}
double getAverage(int arr[], int size)
{
    int i;
    double avg;
    double sum = 0;

    for (i = 0; i < size; ++i)
    {
        sum += arr[i];
    }

    avg = sum / size;

    return avg;
}

/* 要生成和返回随机数的函数 */
int *getRandom()
{
    static int r[10];
    int i;

    /* 设置种子 */
    srand((unsigned)time(NULL));
    for (i = 0; i < 10; ++i)
    {
        r[i] = rand();
        printf("r[%d] = %d\n", i, r[i]);
    }

    return r;
}
void staticArrayDemo()
{
    int staticArray[] = {1, 2, 3, 4, 5}; // 静态数组声明并初始化
    int length = sizeof(staticArray) / sizeof(staticArray[0]);

    printf("静态数组: ");
    for (int i = 0; i < length; i++)
    {
        printf("%d ", staticArray[i]);
    }
    printf("\n");
}
int dynamicArrayDemo()
{
    int size = 5;
    int *dynamicArray = (int *)malloc(size * sizeof(int)); // 动态数组内存分配

    if (dynamicArray == NULL)
    {
        printf("Memory allocation failed.\n");
        return 1;
    }

    printf("Enter %d elements: ", size);
    for (int i = 0; i < size; i++)
    {
        scanf("%d", &dynamicArray[i]);
    }

    printf("Dynamic Array: ");
    for (int i = 0; i < size; i++)
    {
        printf("%d ", dynamicArray[i]);
    }
    printf("\n");

    free(dynamicArray); // 动态数组内存释放
}
int main()
{
    int array[10]; /* n 是一个包含 10 个整数的数组 */
    int i, j;

    /* 初始化数组元素 */
    for (i = 0; i < 10; i++)
    {
        array[i] = i + 100; /* 设置元素 i 为 i + 100 */
    }

    /* 输出数组中每个元素的值 */
    for (j = 0; j < 10; j++)
    {
        printf("Element[%d] = %d\n", j, array[j]);
    }

    int length = LENGTH(array);

    printf("数组长度为: %d\n", sizeof(array));
    printf("LENGTH为: %d\n", length);

    printArray(array, 5); // 将数组名传递给函数

    xyArray();

    double avg;

    /* 传递一个指向数组的指针作为参数 */
    avg = getAverage(array, 5);

    /* 输出返回值 */
    printf("平均值是： %f \n", avg);

    /* 一个指向整数的指针 */
    int *p;
    p = getRandom();
    for (i = 0; i < 10; i++)
    {
        printf("*(p + %d) : %d\n", i, *(p + i));
    }

    staticArrayDemo();
    dynamicArrayDemo();

    return 0;
}